package com.fast.framework.core.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fast.framework.config.security.customize.CustomAuthorityDeserializer;
import com.fast.framework.core.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 用户信息表
 * </p>
 *
 * @author lanyuankeji
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_user")
@ApiModel(value = "User对象", description = "用户信息表")
public class User extends BaseEntity implements UserDetails {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "用户ID")
    @TableId("user_id")
    private String userId;

    @ApiModelProperty(value = "手机号")
    @TableField("phone")
    private String phone;

    @ApiModelProperty(value = "昵称")
    @TableField("nick_name")
    private String nickName;

    @ApiModelProperty(value = "邮箱")
    private String email;

    @ApiModelProperty(value = "QQ OpenID")
    @TableField("qq_open_id")
    private String qqOpenId;

    @ApiModelProperty(value = "微信 OpenID")
    @TableField("wechat_id")
    private String wechatId;

    @ApiModelProperty(value = "GQ头像")
    @TableField("user_avatar")
    private String userAvatar;

    @ApiModelProperty(value = "密码")
    private String password;

    @ApiModelProperty(value = "最后登录时间")
    @TableField("last_login_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date lastLoginTime;

    @ApiModelProperty(value = "使用空间，单位 byte")
    @TableField("use_space")
    private Long useSpace;

    @ApiModelProperty(value = "总空间")
    @TableField("total_space")
    private Long totalSpace;

    @ApiModelProperty(value = "用户名(账号)")
    @TableField("user_name")
    private String username;

    @ApiModelProperty("角色")
    // 在数据库中不存在的字段，设置 exist 属性为 false
    @TableField(exist = false)
    private List<Role> roles;

    @ApiModelProperty("用户唯一标识(缓存存储账号)")
    @TableField(exist = false)
    private String token;

    @ApiModelProperty("登录时间")
    @TableField(exist = false)
    private Long loginTime;

    @ApiModelProperty("过期时间")
    @TableField(exist = false)
    private Long expireTime;

    @ApiModelProperty("登录IP地址")
    @TableField(exist = false)
    private String ipaddr;

    @ApiModelProperty("登录地点")
    @TableField(exist = false)
    private String loginLocation;

    @ApiModelProperty("浏览器类型")
    @TableField(exist = false)
    private String browser;

    @ApiModelProperty("操作系统")
    @TableField(exist = false)
    private String os;

    /**
     * 返回用户的权限。在此示例中，返回null表示用户没有任何权限。
     * <p>
     * 该方法重写了父类的 getAuthorities() 方法，用于返回用户所拥有的权限集合。
     * 在此方法中，将角色集合转换为 SimpleGrantedAuthority 对象的集合。
     *
     * @return 用户权限信息的集合
     */
    @Override
    @JsonDeserialize(using = CustomAuthorityDeserializer.class)
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // 将角色集合转换为 SimpleGrantedAuthority 对象的集合
        return roles.stream().map(role -> new SimpleGrantedAuthority(role.getRoleName())).collect(Collectors.toList());
    }

    /**
     * 检查用户账户是否未过期。在此示例中，始终返回false，表示用户账户已过期。
     *
     * @return 如果用户账户未过期，则返回true；否则返回false
     */
    @Override
    public boolean isAccountNonExpired() {
        //默认未过期
        return true;
    }

    /**
     * 检查用户账户是否未锁定。在此示例中，始终返回false，表示用户账户已被锁定。
     *
     * @return 如果用户账户未锁定，则返回true；否则返回false
     */
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     * 检查用户的凭证是否未过期。在此示例中，始终返回false，表示用户的凭证已过期。
     *
     * @return 如果用户的凭证未过期，则返回true；否则返回false
     */
    @Override
    public boolean isCredentialsNonExpired() {
        //默认未过期
        return true;
    }

    /**
     * 检查用户是否已启用。在此示例中，始终返回false，表示用户已被禁用。
     *
     * @return 如果用户已启用，则返回true；否则返回false
     */
    @Override
    public boolean isEnabled() {
        //返回自己设置的(0:禁用(逻辑删除) 1:启用)
        return super.getDelTags();
    }
}
